﻿using FlexFlow.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace FlexFlow.Base.Interface
{
    /// <summary>
    /// 表示物理模型的提供者，用来对物理模型进行基础管理（增删改查）
    /// </summary>
    public interface IPhysicalEntityProvider<T> where T : PhysicalModel
    {
        /// <summary>
        /// 创建一个新的实体
        /// </summary>
        /// <returns>
        /// 创建的实体
        /// </returns>
        T Create();
        /// <summary>
        /// 增加指定的模型
        /// </summary>
        /// <param name="model">
        /// 要增加的模型实例
        /// </param>
        /// <returns>
        /// 一个值，表示增加是否成功
        /// </returns>
        bool Add(T model);
        /// <summary>
        /// 取得具有指定标识符的模型实体
        /// </summary>
        /// <param name="identity">
        /// 要取得的模型实体的唯一标识符
        /// </param>
        /// <returns>
        /// 取得的模型实体
        /// </returns>
        T Get(Guid identity);
        /// <summary>
        /// 判断具有指定Id的模型实体是否存在
        /// </summary>
        /// <param name="identity">
        /// 要判断的ID
        /// </param>
        /// <returns>
        /// 一个表示实体是否存在的值
        /// </returns>
        bool Exist(Guid identity);
        /// <summary>
        /// 更新指定的模型
        /// </summary>
        /// <param name="model">
        /// 要更新的模型的实例
        /// </param>
        /// <returns>
        /// 一个值，表示更新是否成功
        /// </returns>
        bool Update(T model);
        /// <summary>
        /// 删除指定模型
        /// </summary>
        /// <param name="model">
        /// 要删除的模型的实例
        /// </param>
        /// <returns>
        /// 一个值，表示操作是否成功
        /// </returns>
        bool Delete(T model);
        /// <summary>
        /// 删除指定模型
        /// </summary>
        /// <param name="identity">
        /// 要删除的模型的id
        /// </param>
        /// <returns>
        /// 一个值，表示操作是否成功
        /// </returns>
        bool Delete(Guid identity);
        /// <summary>
        /// 更新指定模型的备注消息
        /// </summary>
        /// <param name="identity">
        /// 要更新备注消息的模型ID
        /// </param>
        /// <param name="tag">
        /// 要更新的备注消息
        /// </param>
        /// <returns>
        /// 一个值，表示更新是否成功
        /// </returns>
        bool UpdateTag(Guid identity, string tag);
    }
}
